import http from "@/lib/http";
import {route} from "ziggy-js";

/**
 * 生成RESTful路由名称映射
 * @param {string} base - 基础路由名称
 * @returns {Object} 包含各操作路由名称的对象
 */
const restfulRoutes = (base) => ({
    create: `${base}.store`,
    update: `${base}.update`,
    show: `${base}.show`,
    delete: `${base}.destroy`,
    index: `${base}.index`
});

/**
 * 创建API请求方法集合
 * @param {string} basePath - 基础路由路径
 * @returns {Object} 包含各API方法的对象
 */
export default function useRequest(basePath) {
    const routes = restfulRoutes(basePath);

    /**
     * 通用请求函数
     * @param {string} method - HTTP方法(get, post, put, delete等)
     * @param {string} routeName - 路由名称
     * @param {Object} [params={}] - 路由参数
     * @param {Object} [data=null] - 请求体数据
     * @param {Object} [config={}] - 额外请求配置(如signal, headers等)
     * @returns {Promise} 请求的Promise对象
     */
    const request = (method, routeName, params = {}, data = null, config = {}) => {
        const url = route(routeName, params);
        return http[method](url, data, config);
    };

    return {
        /**
         * 创建资源
         * @param {Object} form - 创建资源的数据
         * @param {Object} [config={}] - 请求配置
         * @returns {Promise} 请求的Promise对象
         */
        createApi: (form, config = {}) => request('post', routes.create, {}, form, config),

        /**
         * 更新资源
         * @param {number|string} id - 资源ID
         * @param {Object} form - 更新资源的数据
         * @param {Object} [config={}] - 请求配置
         * @returns {Promise} 请求的Promise对象
         */
        updateApi: (id, form, config = {}) => request('put', routes.update, { id }, form, config),

        /**
         * 获取单个资源
         * @param {number|string} id - 资源ID
         * @param {Object} [config={}] - 请求配置
         * @returns {Promise} 请求的Promise对象
         */
        showApi: (id, config = {}) => request('get', routes.show, { id }, null, config),

        /**
         * 删除资源
         * @param {number|string} id - 资源ID
         * @param {Object} [config={}] - 请求配置
         * @returns {Promise} 请求的Promise对象
         */
        deleteApi: (id, config = {}) => request('delete', routes.delete, { id }, null, config),

        /**
         * 获取资源列表
         * @param {Object} [params={}] - 查询参数
         * @param {Object} [config={}] - 请求配置
         * @returns {Promise} 请求的Promise对象
         */
        indexApi: (params = {}, config = {}) => request('get', routes.index, {}, null, { params, ...config })
    };
}
